package com.example.controller;

import com.example.domain.dto.pricelist.*;
import com.example.domain.dto.product.ProductListItemDTO;
import com.example.domain.entity.enums.PriceListStatus;
import com.example.exception.ApiResponse;
import com.example.service.PriceListService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 价目表管理Controller
 * 
 * <p>提供价目表和价格条目的管理接口，包括：
 * <ul>
 *   <li>价目表CRUD操作</li>
 *   <li>价目表激活/停用</li>
 *   <li>价格条目管理</li>
 *   <li>价格查询</li>
 * </ul>
 * </p>
 * 
 * @author Means
 * @since 2025-10-28
 */
@Slf4j
@RestController
@RequestMapping("/api/pricelists")
@RequiredArgsConstructor
public class PriceListController {
    
    private final PriceListService priceListService;
    
    // ==================== 价目表管理 ====================
    
    /**
     * 创建价目表
     * 
     * @param request 创建价目表请求
     * @return 创建的价目表DTO
     */
    @PostMapping
    public ApiResponse<PriceListDTO> createPriceList(@Valid @RequestBody CreatePriceListRequest request) {
        log.info("创建价目表: name={}", request.getName());
        PriceListDTO priceList = priceListService.createPriceList(request);
        log.info("价目表创建成功: id={}, name={}", priceList.getId(), priceList.getName());
        return ApiResponse.success(priceList);
    }
    
    /**
     * 更新价目表
     * 
     * @param id 价目表ID
     * @param request 更新价目表请求
     * @return 更新后的价目表DTO
     */
    @PutMapping("/{id}")
    public ApiResponse<PriceListDTO> updatePriceList(
            @PathVariable String id,
            @Valid @RequestBody UpdatePriceListRequest request) {
        log.info("更新价目表: id={}", id);
        PriceListDTO priceList = priceListService.updatePriceList(id, request);
        log.info("价目表更新成功: id={}", priceList.getId());
        return ApiResponse.success(priceList);
    }
    
    /**
     * 获取价目表详情（包含所有条目）
     * 
     * @param id 价目表ID
     * @return 价目表DTO
     */
    @GetMapping("/{id}")
    public ApiResponse<PriceListDTO> getPriceList(@PathVariable String id) {
        log.debug("获取价目表详情: id={}", id);
        PriceListDTO priceList = priceListService.getPriceListById(id);
        return ApiResponse.success(priceList);
    }
    
    /**
     * 删除价目表（软删除）
     *
     * @param id 价目表ID
     * @return 成功响应
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deletePriceList(@PathVariable String id) {
        log.info("删除价目表: id={}", id);
        priceListService.deletePriceList(id);
        log.info("价目表删除成功: id={}", id);
        return ApiResponse.success();
    }
    
    /**
     * 获取所有价目表列表
     * 
     * @param status 价目表状态（可选）
     * @return 价目表摘要列表
     */
    @GetMapping
    public ApiResponse<List<PriceListSummaryDTO>> getAllPriceLists(
            @RequestParam(required = false) PriceListStatus status) {
        if (status != null) {
            log.debug("按状态查询价目表: status={}", status);
            List<PriceListSummaryDTO> priceLists = priceListService.getPriceListsByStatus(status);
            log.debug("查询到 {} 个价目表", priceLists.size());
            return ApiResponse.success(priceLists);
        } else {
            log.debug("查询所有价目表");
            List<PriceListSummaryDTO> priceLists = priceListService.getAllPriceLists();
            log.debug("查询到 {} 个价目表", priceLists.size());
            return ApiResponse.success(priceLists);
        }
    }
    
    /**
     * 获取当前生效的价目表
     * 
     * @return 当前生效的价目表DTO
     */
    @GetMapping("/current")
    public ApiResponse<PriceListDTO> getCurrentEffectivePriceList() {
        log.debug("获取当前生效的价目表");
        PriceListDTO priceList = priceListService.getCurrentEffectivePriceList();
        return ApiResponse.success(priceList);
    }

    /**
     * 获取当前生效价目表下的商品列表（带价格和折扣信息）
     * 用于前端首页展示所有可售商品
     *
     * @return 商品列表
     */
    @GetMapping("/current/products")
    public ApiResponse<List<ProductListItemDTO>> getCurrentPriceListProducts() {
        log.debug("获取当前价目表下的商品列表");
        List<ProductListItemDTO> products = priceListService.getCurrentPriceListProducts();
        log.debug("查询到 {} 个商品", products.size());
        return ApiResponse.success(products);
    }

    // ==================== 价目表激活/停用 ====================
    
    /**
     * 激活价目表
     * 
     * @param id 价目表ID
     * @return 更新后的价目表DTO
     */
    @PutMapping("/{id}/activate")
    public ApiResponse<PriceListDTO> activatePriceList(@PathVariable String id) {
        log.info("激活价目表: id={}", id);
        PriceListDTO priceList = priceListService.activatePriceList(id);
        log.info("价目表激活成功: id={}", priceList.getId());
        return ApiResponse.success(priceList);
    }
    
    /**
     * 停用价目表
     * 
     * @param id 价目表ID
     * @return 更新后的价目表DTO
     */
    @PutMapping("/{id}/deactivate")
    public ApiResponse<PriceListDTO> deactivatePriceList(@PathVariable String id) {
        log.info("停用价目表: id={}", id);
        PriceListDTO priceList = priceListService.deactivatePriceList(id);
        log.info("价目表停用成功: id={}", priceList.getId());
        return ApiResponse.success(priceList);
    }
    
    // ==================== 价格条目管理 ====================
    
    /**
     * 添加价格条目
     * 
     * @param priceListId 价目表ID
     * @param request 添加价格条目请求
     * @return 添加的价格条目DTO
     */
    @PostMapping("/{priceListId}/entries")
    public ApiResponse<PriceListEntryDTO> addPriceEntry(
            @PathVariable String priceListId,
            @Valid @RequestBody AddPriceEntryRequest request) {
        log.info("添加价格条目: priceListId={}, productId={}", 
                priceListId, request.getProductId());
        PriceListEntryDTO entry = priceListService.addPriceEntry(priceListId, request);
        log.info("价格条目添加成功: entryId={}", entry.getId());
        return ApiResponse.success(entry);
    }
    
    /**
     * 删除价格条目
     * 
     * @param priceListId 价目表ID（路径参数，仅用于语义清晰）
     * @param entryId 价格条目ID
     * @return 成功响应
     */
    @DeleteMapping("/{priceListId}/entries/{entryId}")
    public ApiResponse<Void> deletePriceEntry(
            @PathVariable String priceListId,
            @PathVariable String entryId) {
        log.info("删除价格条目: priceListId={}, entryId={}", priceListId, entryId);
        priceListService.deletePriceEntry(entryId);
        log.info("价格条目删除成功: entryId={}", entryId);
        return ApiResponse.success();
    }
    
    /**
     * 获取价目表的所有条目
     * 
     * @param priceListId 价目表ID
     * @return 价格条目列表
     */
    @GetMapping("/{priceListId}/entries")
    public ApiResponse<List<PriceListEntryDTO>> getPriceEntries(@PathVariable String priceListId) {
        log.debug("获取价目表的所有条目: priceListId={}", priceListId);
        List<PriceListEntryDTO> entries = priceListService.getPriceEntriesByPriceList(priceListId);
        log.debug("查询到 {} 条价格条目", entries.size());
        return ApiResponse.success(entries);
    }
    
    // ==================== 价格查询 ====================
    // 注：价格查询功能已集成到商品列表中，前端无需单独调用
}

